环境
vs 2017
windows 7 32位
windbg
我用的是vs2017编译的poc.c(我这边的话需要设置 不使用预编译头),但是在windows 7上没有崩溃
后来我使用看雪的poc编译(https://bbs.pediy.com/thread-178154.htm),那就可以触发崩溃了
| 1 | kd> g | 
id打开win32k.sys
跟着作者,来着这个异常函数,里面调用了pprFlattenRec
| 1 | signed int __thiscall EPATHOBJ::bFlatten(EPATHOBJ *this) | 
在EPATHOBJ::pprFlattenRec之后调用EPATHOBJ::newpathrec,之后newpathalloc
| 1 | struct PATHALLOC *__stdcall newpathalloc() | 
我们添加结构体继续分析
| 1 | typedef struct _PATHRECORD { | 
在 EPATHOBJ::pprFlattenRec里面,我们将v29转化成struct显示
| 1 | if ( EPATHOBJ::newpathrec(this, &v29, &v27, 0x7FFFFFFFu) == (struct PATHALLOC *)1 ) | 
漏洞利用
漏洞利用还是复杂了点,主要是新建了三个record
| 1 | // | 
填充freelist,据说是创建贝里尔曲线,以便在其直线化的时候调用漏洞函数
| 1 | // Generate a large number of Belier Curves made up of pointers to our | 
最后
v3->prev->next = v3;
就可以把HalDispatchTable改写
reference
《漏洞战争》
 
         
        